home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Oberon / examples.lha / Examples / Oberon0 / FoldElems0.Mod < prev    next >
Encoding:
Text File  |  1995-04-16  |  3.0 KB  |  105 lines

  1. MODULE FoldElems0;  (*HM Mar-25-92, fjc 16/4/95*)
  2. IMPORT OS, Texts0, TextFrames0, Viewers0;
  3.  
  4. CONST
  5.   colLeft* = 0; colRight* = 1; expRight* = 2; expLeft* = 3;
  6.  
  7. TYPE
  8.   Element* = POINTER TO ElemDesc;
  9.   ElemDesc* = RECORD (Texts0.ElemDesc)
  10.     mode-: INTEGER;
  11.     hidden: Texts0.Text
  12.   END;
  13.  
  14. VAR
  15.   pat: ARRAY 4 OF OS.Pattern;
  16.   eW, eH: INTEGER;
  17.  
  18. PROCEDURE Twin (e: Texts0.Element; t: Texts0.Text; VAR pos: LONGINT)
  19. : Element;
  20.   VAR level: INTEGER;
  21. BEGIN
  22.   t.SetPos(pos + 1); level := 1;
  23.   LOOP t.ReadNextElem(e); pos := t.pos - 1;
  24.     IF e = NIL THEN RETURN NIL
  25.     ELSIF e IS Element THEN
  26.       IF e(Element).mode IN {expLeft, colLeft} THEN
  27.         INC(level) ELSE DEC(level)
  28.       END;
  29.       IF level = 0 THEN RETURN e(Element) END
  30.     END
  31.   END
  32. END Twin;
  33.  
  34. PROCEDURE (e: Element) Copy* (): Texts0.Element;
  35.   VAR x: Element;
  36. BEGIN NEW(x); x.w := e.w; x.h := e.h; x.dsc := e.dsc; x.mode := e.mode;
  37.   IF e.hidden # NIL THEN
  38.     NEW(x.hidden); x.hidden.Clear;
  39.     x.hidden.Insert(0, e.hidden, 0, e.hidden.len)
  40.   END;
  41.   RETURN x
  42. END Copy;
  43.  
  44. PROCEDURE (e: Element) Draw* (x, y: INTEGER);
  45. BEGIN OS.DrawPattern(pat[e.mode], x + 2, y - e.dsc)
  46. END Draw;
  47.  
  48. PROCEDURE (e: Element) HandleMouse* (f: OS.Object; x, y: INTEGER);
  49.   VAR
  50.     buttons: SET; e1: Element; t: Texts0.Text; pos, pos1, len1: LONGINT;
  51.     m: Texts0.NotifyReplMsg;
  52. BEGIN
  53.   REPEAT OS.GetMouse(buttons, x, y) UNTIL buttons = {};
  54.   WITH f: TextFrames0.Frame DO
  55.     IF e.mode IN {expLeft, colLeft} THEN
  56.       pos := f.text.ElemPos(e); pos1 := pos; e1 := Twin(e, f.text, pos1);
  57.       len1 := e.hidden.len;
  58.       NEW(t); t.Clear; t.Insert(0, f.text, pos + 1, pos1);
  59.       f.text.Delete(pos + 1, pos1);
  60.       f.text.Insert(pos + 1, e.hidden, 0, e.hidden.len); e.hidden := t;
  61.       e.mode := 3 - e.mode; e1.mode := 3 - e1.mode;
  62.       m.t := f.text; m.beg := pos; m.end := pos + len1 + 1;
  63.       Viewers0.Broadcast(m)
  64.     END
  65.   END
  66. END HandleMouse;
  67.  
  68. PROCEDURE (e: Element) Load* (VAR r: OS.Rider);
  69.   VAR x: OS.Object;
  70. BEGIN e.Load^ (r); r.ReadInt(e.mode); r.ReadObj(x);
  71.   IF x # NIL THEN e.hidden := x(Texts0.Text) END
  72. END Load;
  73.  
  74. PROCEDURE (e: Element) Store* (VAR r: OS.Rider);
  75. BEGIN e.Store^ (r); r.WriteInt(e.mode); r.WriteObj(e.hidden)
  76. END Store;
  77.  
  78. PROCEDURE Insert*;
  79.   VAR f: TextFrames0.Frame; e: Element; beg, end: LONGINT;
  80. BEGIN
  81.   TextFrames0.GetSelection(f);
  82.   IF f # NIL THEN
  83.     beg := f.selBeg.pos; end := f.selEnd.pos;
  84.     NEW(e); e.mode := expRight; e.w := eW; e.h := eH; e.dsc := 0;
  85.     f.text.SetPos(end); f.text.WriteElem(e);
  86.     NEW(e); e.mode := expLeft; e.w := eW; e.h := eH; e.dsc := 0;
  87.     NEW(e.hidden); e.hidden.Clear;
  88.     f.text.SetPos(beg); f.text.WriteElem(e)
  89.   END
  90. END Insert;
  91.  
  92. PROCEDURE Init;
  93.   VAR fnt: OS.Font; dx, x, y, w, h: INTEGER;
  94. BEGIN
  95.   fnt := OS.FontWithName("Syntax10.Scn.Fnt");
  96.   OS.GetCharMetric(fnt, 0BBX, dx, x, y, w, h, pat[0]);  (*collapsed open*)
  97.   OS.GetCharMetric(fnt, 0ABX, dx, x, y, w, h, pat[1]);  (*collapsed close*)
  98.   OS.GetCharMetric(fnt, 0BBX, dx, x, y, w, h, pat[2]);  (*expanded close*)
  99.   OS.GetCharMetric(fnt, 0ABX, dx, x, y, w, h, pat[3]);  (*expanded open*)
  100.   eW := dx; eH := h;
  101. END Init;
  102.  
  103. BEGIN Init
  104. END FoldElems0.
  105.